// ----------------- Map trait --------------------

// 注意返回值的类型，使用impl Iterator<Item = i32> + 'a，其中'a表示生命周期参数，表示返回的迭代器的生命周期与传入的集合的生命周期相同。
fn double_positives<'a>(numbers: &'a Vec<i32>) -> impl Iterator<Item = i32> + 'a {
    numbers
        .iter()
        .filter(|x| x > &&0)
        .map(|x| x * 2)
}

fn main() {
    let singles = vec![-3, -2, 2, 3];
    let doubles = double_positives(&singles);
    println!("{:?}", doubles.collect::<Vec<i32>>());
    // assert_eq!(doubles.collect::<Vec<i32>>(), vec![4, 6]);
}